home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 365_02 / misc.c < prev    next >
C/C++ Source or Header  |  1992-04-04  |  2KB  |  104 lines

  1. /* misc.c */
  2.  
  3. /* Author:
  4.  *    Steve Kirkendall
  5.  *    14407 SW Teal Blvd. #C
  6.  *    Beaverton, OR 97005
  7.  *    kirkenda@cs.pdx.edu
  8.  */
  9.  
  10.  
  11. /* This file contains functions which didn't seem happy anywhere else */
  12.  
  13. #include "config.h"
  14. #include "vi.h"
  15.  
  16.  
  17. /* find a particular line & return a pointer to a copy of its text */
  18. char *fetchline(line)
  19.     long    line;    /* line number of the line to fetch */
  20. {
  21.     int        i;
  22.     REG char    *scan;    /* used to search for the line in a BLK */
  23.     long        l;    /* line number counter */
  24.     static BLK    buf;    /* holds ONLY the selected line (as string) */
  25.     REG char    *cpy;    /* used while copying the line */
  26.     static long    nextline;    /* }  These four variables are used */
  27.     static long    chglevel;    /*  } to implement a shortcut when  */
  28.     static char    *nextscan;    /*  } consecutive lines are fetched */
  29.     static long    nextlnum;    /* }                                */
  30.  
  31.     /* can we do a shortcut? */
  32.     if (changes == chglevel && line == nextline)
  33.     {
  34.         scan = nextscan;
  35.     }
  36.     else
  37.     {
  38.         /* scan lnum[] to determine which block its in */
  39.         for (i = 1; line > lnum[i]; i++)
  40.         {
  41.         }
  42.         nextlnum = lnum[i];
  43.  
  44.         /* fetch text of the block containing that line */
  45.         scan = blkget(i)->c;
  46.  
  47.         /* find the line in the block */
  48.         for (l = lnum[i - 1]; ++l < line; )
  49.         {
  50.             while (*scan++ != '\n')
  51.             {
  52.             }
  53.         }
  54.     }
  55.  
  56.     /* copy it into a block by itself, with no newline */
  57.     for (cpy = buf.c; *scan != '\n'; )
  58.     {
  59.         *cpy++ = *scan++;
  60.     }
  61.     *cpy = '\0';
  62.  
  63.     /* maybe speed up the next call to fetchline() ? */
  64.     if (line < nextlnum)
  65.     {
  66.         nextline = line + 1;
  67.         chglevel = changes;
  68.         nextscan = scan + 1;
  69.     }
  70.     else
  71.     {
  72.         nextline = 0;
  73.     }
  74.  
  75.     /* Calls to fetchline() interfere with calls to pfetch().  Make sure
  76.      * that pfetch() resets itself on its next invocation.
  77.      */
  78.     pchgs = 0L;
  79.  
  80.     /* Return a pointer to the line's text */
  81.     return buf.c;
  82. }
  83.  
  84.  
  85. /* error message from the regexp code */
  86. void regerror(txt)
  87.     char    *txt;    /* an error message */
  88. {
  89.     msg("RE error: %s", txt);
  90. }
  91.  
  92. /* This function is equivelent to the pfetch() macro */
  93. void    pfetch(l)
  94.     long    l;    /* line number of line to fetch */
  95. {
  96.     if(l != pline || changes != pchgs)
  97.     {
  98.         pline = (l);
  99.         ptext = fetchline(pline);
  100.         plen = strlen(ptext);
  101.         pchgs = changes;
  102.     }
  103. }
  104.